/**
 * @Author: 吕庆龙
 * @Date: 2019/12/11 14:31
 * <p>
 * 功能描述:
 */
public class Interview_012 {

    public static void main(String[] args) {
        System.out.println(Power(2, 3));
    }


    /**
     * 1.题目
     * 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
     * 保证base和exponent不同时为0
     * <p>
     * 2.考点:
     *
     * <p>
     * 3.解析
     * 参考-->快速幂: https://blog.csdn.net/Harington/article/details/87602682
     */
    public static double Power(double base, int exponent) {
//        if (base == 0){
//            return 0;
//        }
        double result = 1; //如果exponent=0,那么result刚好返回1
        int p = Math.abs(exponent);
        while (p > 0) {
            if ((p & 1) == 1) {
                result = result * base;
            }
            base *= base;
            p = p >> 1;
        }
        return exponent > 0 ? result : 1 / result;
    }


    /**
     * 这种直接调java函数的方法终归是不太好
     */
    public double Power1(double base, int exponent) {
        if (base == 0 && exponent == 0) {
            return -1;
        }
        return Math.pow(base, exponent);
    }

    /**
     * 可以像下面这样用if判断写。
     */
    public static double Power2(double base, int exponent) {
        //由于exponent是int类型的整数，则可能包含正整数、0以及负整数三种情况。
        double temp = 1;
        if (exponent > 0) {
            for (int i = 1; i <= exponent; i++) {
                temp = temp * base;
                if (temp > 1.7976931348623157E308) {
                    System.out.println("已经超出double类型的取值范围。");
                    return -1;
                }
            }
            return temp;

        }
        if (exponent < 0) {
            exponent = -exponent;
            for (int i = 1; i <= exponent; i++) {
                temp = temp * base;
                if (temp > 1.7976931348623157E308) {
                    System.out.println("已经超出double类型的取值范围。");
                    return -1;
                }
            }
            temp = 1.0 / temp;
            return temp;
        } else {
            return 1;
        }

    }

}
